import random
import copy
#定义一个角色类，包含：姓名，性别，血量，装备，vip等级，余额
class Character():
    #定义用户属性格式，主要是设置初始值
    information = {'name':'','sex':'','blood_volume':100,'equipment':'拳头','vip':'0','money':0,'ATK':10}
    vip = {'0':0,'1':20,'2':40,'3':60}
    #定义装备列表
    equitments = {'0':{'布衣':{'blood_volume':0,'cost':0}},\
                  '1':{'竹衣':{'blood_volume':20,'cost':20},'防弹衣':{'blood_volume':50,'cost':50}},
                  '2':{'青冈剑':{'ATK':2,'cost':10},'青龙偃月刀':{'ATK':5,'cost':20}}}
    #初始化用户，将姓名和性别传入infor字典进行存储
    def __init__(self,name,sex):
        self.information['name'] = name
        self.information['sex'] = sex
        # 充值，判断输入是否正确，输入不正确会返回相应信息，没问题会成功充值
    def pay_money(self,money):
        if money.isdigit():
            self.information['money'] += int(money)
            return True
        else:
            return False
        # 购买VIP的方法，判断输入是否正确，余额是否足，输入不正确和余额不足会返回相应信息，都没问题会成功购买
    def become_vip(self,vip,money):
        if int(vip) <0 or int(vip) >3:
            return 'out_of_range'
        elif money < self.vip[vip]:
            return 'lake_of_money'
        else:
            self.information['money'] -= money
            self.information['vip'] = vip
            self.information['blood_volume'] += self.vip[vip]
            return 'success'
        #购买装备的方法，判断输入是否正确，余额是否足，输入不正确和余额不足会返回相应信息，都没问题会成功购买
    def get_equitment(self,type,equitment):
        if int(type) <0 or int(type) >2:
            return 'out_of_range'
        elif self.information['money'] < self.equitments[type][equitment]['cost']:
            return 'lake_of_money'
        else:
            self.information['money'] -= self.equitments[type][equitment]['cost']
            self.information['equipment'] = equitment
            if type == '2':
                self.information['ATK'] += self.equitments[type][equitment]['ATK']
            else:
                self.information['blood_volume'] += self.equitments[type][equitment]['blood_volume']
            return 'success'

class Arena():
    room = {}
    def __init__(self,character_dict):
        self.room = character_dict
    def fight(self):
        print("战斗开始！！！")
        print(f"{self.room['1']['name']}  VS  {self.room['2']['name']}\n")
        while self.room['1']['blood_volume'] >0 and self.room['2']['blood_volume'] >0:
            random_num = str(random.randint(1,2))
            if random_num == '1':
                self.room['2']['blood_volume'] -= (self.room['1']['ATK'] + int(self.room['1']['vip'])*0.1)
                print(f"{self.room['1']['name']}  使用  {self.room['1']['equipment']}  对  {self.room['2']['name']}\
造成了  {self.room['1']['ATK'] + int(self.room['1']['vip'])*0.1}  点伤害\
{self.room['2']['name']}  还剩  {self.room['2']['blood_volume']}  滴血")
            else:
                self.room['1']['blood_volume'] -= (self.room['2']['ATK'] + int(self.room['1']['vip'])*0.1)
                print(f"{self.room['2']['name']}  使用  {self.room['2']['equipment']}  对  {self.room['1']['name']}\
造成了  {self.room['2']['ATK'] + int(self.room['2']['vip']) * 0.1}  点伤害\
{self.room['1']['name']}  还剩  {self.room['1']['blood_volume']}  滴血")
        if self.room['1']['blood_volume'] >0:
            return self.room['1']['name']
        elif self.room['2']['blood_volume'] >0:
            return self.room['2']['name']
        else:
            return 'all die'

#测试购买vip和装备的输入是否正确和余额是否足够，返回相应状态信息
def test(status,action):
    if status == 'out_of_range':
        print("您的输入有误，请重新输入\n")
    elif status == 'lake_of_money':
        print("您的金额不足,请先进行充值\n")
    else:
        print(f"{action}成功\n")
    return

#使用count_people记录创建的用户数，后面作为用户列表character_dict的key----id
count_people = 1
#创建一个保存用户的总字典表
character_dict = {}
while True:
    print("欢迎来到世界倒霉蛋大赛\n")
    #用户创建角色
    print(f"请创建你的第{count_people}个角色")
    #创建角色操作，输入有误就重新输
    while True:
        user_status = input("请输入你要进行的操作: 1:创建角色  q:退出 ")
        if user_status.lower() == 'q':
            print("已退出")
            exit()
        elif user_status != '1':
            print("您的输入有误，请重新输入\n")
        else:
            break
    #输入角色信息，判断性别是否输入正确
    while True:
        user_name = input("请输入你的姓名:")
        user_sex = input("请输入你的性别(男:m,女:f):")
        #判断性别是否输入正确
        if user_sex != 'm' and user_sex != 'f':
            print("您的性别输入有误，请重新输入\n")
        else:
            print("用户创建成功，接下来让我们开始愉快的玩耍吧\n")
            break
    #比赛主页选择要进行的操作
    #初始化角色，包含：姓名，性别
    character = Character(user_name,user_sex)
    #游戏主页，选择要进行的操作，主要分为5块----1:充值 2:开通会员 3:购买装备 4:加入房间 q:退出
    while True:
        print("请选择你要进行的操作：1:充值 2:开通会员 3:购买装备 4:加入房间 q:退出")
        print("成为我们尊贵的VIP会员能享受VIPn*10%的暴击伤害和增加VIPn*20的血量哦\n")
        do_what = input("请输入：")
        if do_what == '1':
                money = input("请输入你要充值的金额：")
                # 将要充值的金额穿给用户类进行充值，判断输入是否成功，成功返回True
                if character.pay_money(money):
                    print("充值成功\n")
                    continue
                print("您输入的金额不正确，请重新输入\n")
        elif do_what == '2':
                print(f"vip等级和购买金额如下\n{character.vip}")
                vip = input("请输入你要充值的vip等级(vip1:1,vip2:2,vip3:3)：")
                # 将要购买的VIP等级传给character类的get_vip方法进行购买
                get_vip = character.become_vip(vip,character.vip[vip])
                #使用def test测试输入和余额
                test(get_vip,'VIP开通')
        elif do_what == '3':
                print(f"vip等级和购买金额如下\n{character.equitments}")
                type = input("请输入你要购买的装备类别（开头表示类别，0，为初始状态；1为防御装备，增加对应血量；2为攻击装备，增加对应物理伤害；(比如：1)：")
                equitment = input("请输入你要购买的装备(比如：防弹衣)：")
                #将要购买的装备类型和具体装备传给character类的get_equitment方法进行购买
                get_equitment = character.get_equitment(type,equitment)
                #使用def test测试输入和余额
                test(get_equitment,'购买')
        elif do_what == '4':
            #将初始化的用户实例放入用户列表，使用深拷贝防止后面初始化character字典的时候会覆盖前面的内容
            character_dict[str(count_people)] = copy.deepcopy(character.information)
            print("加入房间成功\n")
            #当房间加入了2个角色的时候战斗开始，可优化使用变量来判断
            if count_people == 2:
                # 将用户列表中的用户传给room，再Arena类中可以直接调用room中的角色信息
                room = Arena(character_dict)
                print(f"\n{room.fight()}  获得了最终胜利")
            count_people +=1
            break
        elif do_what.lower() == 'q':
            exit()
        else:
            print("你的输入有误，请重新输入\n")
